package in.lib.manager;
import in.lib.Debug;
import in.model.DraftPost;
import in.model.User;
import in.obj.Auth;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import lombok.Getter;
import net.callumtaylor.asynchttp.AsyncHttpClient;
import net.callumtaylor.asynchttp.obj.entity.MultiPartEntity;
import net.callumtaylor.asynchttp.response.AsyncHttpResponseHandler;
import net.callumtaylor.asynchttp.response.JsonResponseHandler;
import org.apache.http.Header;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.message.BasicHeader;
import android.content.Context;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import com.google.gson.JsonObject;
/**
* Handles all api calls
* @author CallumTaylor
*/
public class ImageAPIManager
{
public enum Provider
{
APPNET(4, "App.net", APIManager.API_URL + APIManager.API_STREAM + APIManager.API_VERSION + "files", "", 20),
IMGLY(1, "Imgly", "http://img.ly/api/2/upload.json", "", 22),
BLIMS(3, "Blims", "http://bli.ms/api/upload/", "", 22);
//FTP("", "");
@Getter private final int id;
@Getter private final String url;
@Getter private final String clientToken;
@Getter private final String name;
private final int urlLength;
private Provider(int id, String name, String url, String clientToken, int urlLength)
{
this.id = id;
this.name = name;
this.url = url;
this.clientToken = clientToken;
this.urlLength = urlLength;
}
public int getUrlLength()
{
if (this == APPNET)
{
return urlLength + SettingsManager.getPostIdLength();
}
return urlLength;
}
public static Provider getProviderById(int id)
{
for (Provider v : values())
{
if (v.getId() == id) return v;
}
return null;
}
}
private static volatile ImageAPIManager mAPIManager;
public static ImageAPIManager getInstance()
{
if (mAPIManager == null)
{
mAPIManager = new ImageAPIManager();
}
return mAPIManager;
}
public void registerForToken(final Context c, final User user)
{
MultiPartEntity params = new MultiPartEntity();
params.addPart("grant_type", "delegate");
params.addPart("delegate_client_id", SettingsManager.getImageProvider().getClientToken());
final HashMap<String, Auth> auths = UserManager.getAuths(c);
AsyncHttpClient client = new AsyncHttpClient(APIManager.API_AUTH + "?access_token=" + auths.get(user.getId()).getAccessToken());
client.post(params, new JsonResponseHandler()
{
@Override public void onSuccess()
{
JsonObject response = getContent().getAsJsonObject();
String token = response.get("delegate_token").getAsString();
auths.get(user.getId()).getImageDelegateToken().put(SettingsManager.getImageProvider(), token);
if (c != null)
{
UserManager.setAuths(c, auths);
}
}
});
}
public void blimsSetPostThread(String code, String threadId, AsyncHttpResponseHandler response)
{
AsyncHttpClient client = new AsyncHttpClient(SettingsManager.getImageProvider().getUrl() + "update/");
MultiPartEntity params = new MultiPartEntity();
params.addPart("post_id", threadId);
params.addPart("short_code", code);
client.post(params, response);
}
public void uploadImage(Context c, DraftPost holder, User u, int orientation, AsyncHttpResponseHandler response)
{
try
{
final HashMap<String, Auth> auths = UserManager.getAuths(c);
if (SettingsManager.getImageProvider() == Provider.IMGLY || SettingsManager.getImageProvider() == Provider.BLIMS)
{
if (TextUtils.isEmpty(auths.get(u.getId()).getImageDelegateToken().get(SettingsManager.getImageProvider())))
{
registerForToken(c, u);
response.onFailure();
return;
}
}
// send the image
MultiPartEntity params = new MultiPartEntity();
if (SettingsManager.getImageProvider() == Provider.BLIMS)
{
params.addPart("app_key", "7fa0bee0a0a8cafa8a100580954436f1");
params.addPart("text", holder.getPostText());
}
List<Header> headers = new ArrayList<Header>();
if (SettingsManager.getImageProvider() == Provider.APPNET)
{
params.addPart("type", "robin.image.photo");
params.addPart("kind", "image");
headers.add(new BasicHeader("Authorization", "BEARER " + auths.get(u.getId()).getAccessToken()));
params.addPart("content", getImageBody(c, holder.getImagePath()));
}
else
{
headers.add(new BasicHeader("Identity-Delegate-Token", auths.get(u.getId()).getImageDelegateToken().get(SettingsManager.getImageProvider())));
headers.add(new BasicHeader("Identity-Delegate-Endpoint", "https://alpha-api.app.net/stream/0/token"));
params.addPart("media", getImageBody(c, holder.getImagePath()));
}
AsyncHttpClient client = new AsyncHttpClient(SettingsManager.getImageProvider().getUrl());
client.post(params, headers, response);
}
catch (Exception e)
{
Debug.out(e);
}
}
public ContentBody getImageBody(Context c, String path)
{
Uri imageUri = Uri.parse(path);
if (imageUri.getScheme().startsWith("content"))
{
try
{
ParcelFileDescriptor parcelFileDescriptor = c.getContentResolver().openFileDescriptor(imageUri, "r");
final long size = parcelFileDescriptor.getStatSize();
parcelFileDescriptor.close();
InputStream fs = c.getContentResolver().openInputStream(imageUri);
return new InputStreamBody(fs, "image/jpeg", "image.jpg")
{
@Override public long getContentLength()
{
return size;
}
};
}
catch (Exception e)
{
e.printStackTrace();
}
}
else if (imageUri.getScheme().startsWith("file"))
{
return new FileBody(new File(imageUri.getPath()), "image/jpeg");
}
return null;
}
}